#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <random>

int main(int argc, char* argv[]) {
	// Falta el archivo
	if( argc < 6 ) {
		printf(" 1) Output valido\n 2) Distribucion\n 3) Tope cant. cursos\n 4) Fecha inicio\n 5) Fecha final\n");
		return -1; 
	}

	// Abro el archivo
	const char* archivoOut = argv[1];
	int modo = atoi(argv[2]);
	int maxCantCursos = atoi(argv[3]);
	int fechaInicio = atoi(argv[4]);
	int fechaFinal = atoi(argv[5]);
	
	printf("Generando\n");
	srand(time(NULL));
	
	FILE* archivo = fopen(archivoOut, "a" );

	double media = (fechaFinal-fechaInicio) / 2;
	std::default_random_engine generador;
	std::normal_distribution<double> distribucion(media, media/2.0);

	int cantCursos;
	int aleatorio;
	double comienzo;
	int duracion;
	int final;
	int duracionTotal;
	int i = 0;
	bool salir = false;

	for(int j=1; j <= maxCantCursos; j++) {
		if (salir)
			break;

		cantCursos = j;
		fprintf(archivo, "%i ", cantCursos);

		switch(modo) {
			case 1:
				// DISTRIBUCION GAUSSIANA -----------------------------------------------------		
				while(i < cantCursos) {
					aleatorio = rand() % 5+1;
					comienzo = distribucion(generador);
					duracion = (fechaFinal - int(comienzo)) / aleatorio;
					final = int(comienzo) + duracion;

					if ((int(comienzo)>=fechaInicio)&&(final<=fechaFinal)) {
						fprintf(archivo, "%i ", int(comienzo));
						fprintf(archivo, "%i ", final);
						i++;
					}
				}
			
				fprintf(archivo, "\n");
				break;
				
			case 2:
				// DISTRIBUCION UNIFORME ------------------------------------------------------
				while(i < cantCursos) {
					aleatorio = rand() % 5+1;
					comienzo = rand() % fechaFinal+fechaInicio;
					duracion = (fechaFinal - comienzo) / aleatorio;
					final = comienzo + duracion;

					if ((int(comienzo)>=fechaInicio)&&(final<=fechaFinal)) {
						fprintf(archivo, "%i ", int(comienzo));
						fprintf(archivo, "%i ", final);
						i++;
					}
				}

				fprintf(archivo, "\n");
				break;

			case 3:
				// TODOS SOLAPADOS ------------------------------------------------------------
				while(i < cantCursos) {
					aleatorio = rand() % 5+1;
					comienzo = rand() % int(media)+fechaInicio;
					final = rand() % fechaFinal+media;

					if ((int(comienzo)>=fechaInicio)&&(int(comienzo)<media)&&(final<=fechaFinal)&&(final>media)) {
						fprintf(archivo, "%i ", int(comienzo));
						fprintf(archivo, "%i ", final);
						i++;
					}
				}

				fprintf(archivo, "\n");
				break;

			case 4:
				// NINGUNO SOLAPADO -----------------------------------------------------------
				duracion = fechaInicio;
				duracionTotal = fechaFinal - fechaInicio;
				duracionTotal = duracionTotal / cantCursos;
				if (duracionTotal < 1) {
					duracionTotal = 1;
				}

				while(i < cantCursos) {
					aleatorio = rand() % duracionTotal+1;
					comienzo = duracion;
					final = duracion + aleatorio;

					if ((final<=fechaFinal)&&(final>comienzo)) {
						fprintf(archivo, "%i ", int(comienzo));
						fprintf(archivo, "%i ", final);
						duracion = final;
						i++;
					}
				}

				fprintf(archivo, "\n");
				break;

			default:
				// DEFAULT --------------------------------------------------------------------
				printf("Modos: 1) Dist. Gaussiana 2) Dist. Uniforme 3) Todos solapados 4) Ninguno solapado\n");
				salir = true;
				break;
				//-----------------------------------------------------------------------------
		}

		i = 0;
	}
	
	fprintf(archivo, "#");
	
	fclose(archivo);
	
	printf("Archivo generado\n");
	return 0;
}


